/*
@ClassName ScheduleUtils
@Description TODO
@Author SubUp
@Date   2022/8/5
@Version 1.0
*/

package com.sunjob.mrojobschedule.util;

import com.sunjob.common.constant.ScheduleConstant;
import com.sunjob.common.domain.scheduleServer.JobSchedule;
import com.sunjob.common.domain.scheduleServer.PlanSchedule;
import com.sunjob.common.domain.scheduleServer.orm.PlanResult;
import com.sunjob.common.exception.MROException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Component
public class ScheduleUtils {
    //数据转换
    /**
     * long---string
     * @param lo
     * @return
     */
    public static String transferStringByLong(Long lo){
        return String.valueOf(lo);
    }

    /**
     * int---string
     * @param in
     * @return
     */
    public static String transferStringByInteger(Integer in){
        return String.valueOf(in);
    }

    /**
     * string---int
     * @param var
     * @return
     */
    public static Integer transferToInt(String var){
        if(var != null && var.length() != 0 && checkNumber(var))
            return Integer.parseInt(var);
        if(!checkNumber(var))
            return ScheduleConstant.DISABLE_USE_Int;
        return ScheduleConstant.DEFAULT_INTEGER_VALUE;
    }

    /**
     * long---string
     * @param var
     * @return
     */
    public static Long transferToLong(String var){
        if(var != null && var.length() != 0 && checkNumber(var))
            return Long.parseLong(var);
        if(!checkNumber(var))
            return ScheduleConstant.DISABLE_USE_Long;
        return ScheduleConstant.DEFAULT_LONG_VALUE;
    }

    /**
     * 字符串内只能出现数字字面量
     * @param var
     * @return
     */
    public static Boolean checkNumber(String var){
        String regex = "^[0-9]*$";
        Pattern pattern = Pattern.compile(regex);
        Matcher m = pattern.matcher(var);
        return m.matches();
    }
    public static void verifyNumber(String var){
        if(!checkNumber(var))
            throw new MROException("只允许0-9数字",500);
    }

    //数据校验
    public static void checkCardId(String var){
        String regex = "^[a-z0-9A-Z]{5}$";
        Pattern pattern = Pattern.compile(regex);
        Matcher m = pattern.matcher(var);
        if(!m.matches())
            throw new MROException("工号格式不规范",500);
    }
    public static void checkName(String var){
        String regex = "^[a-zA-Z\u4e00-\u9fa5]+$";
        Pattern pattern = Pattern.compile(regex);
        Matcher m = pattern.matcher(var);
        if(!m.matches())
            throw new MROException("姓名格式不规范",500);
    }
    /**
     * 字符串内只能出现0-9 a-z A-Z 以及中文
     * @param var
     * @return
     */
    public static void checkConsequence(String var){
        String regex = "^[a-z0-9A-Z\u4e00-\u9fa5]+$";
        Pattern pattern = Pattern.compile(regex);
        Matcher m = pattern.matcher(var);
        if(!m.matches())
            throw new MROException("字符串只能有英文字母、数字、中文!",500);
    }



    /**
     * 校验数据是否为空
     * @param o
     * @return
     */
    public static boolean checkIsEmpty(Object o){
        if (o == null && "".equals(o)){
            return false;
        }
        return true;
    }

    /**
     * 校验数据是否在0-i之间(包括0和i),主要用于对枚举类型数据进行校验
     * @param enumerate
     * @param i
     * @return
     */
    public static void enumerateCheck(int enumerate,int i){
        String regex = "^[0-" + i + "]{1}$";
        Pattern pattern = Pattern.compile(regex);
        Matcher m = pattern.matcher(ScheduleUtils.transferStringByInteger(enumerate));
        if(!m.matches())
            throw new MROException("枚举值超出范围",500);
    }

    /**
     * 校验数据长度是否在指定长度之内
     * @param str
     * @param start
     * @param end
     * @return
     */
    public static void checkDataLength(String str,int start,int end){
        String regex = "^[a-z0-9A-Z\u4e00-\u9fa5]{"+start+","+end+"}+$";
        Pattern pattern = Pattern.compile(regex);
        Matcher m = pattern.matcher(str);
        if(!m.matches())
            throw new MROException("数据长度不规范",500);
    }

    /**
     * 校验BaseEntity对象
     * **/
    public static void baseEntityCheck(String createBy,String updateBy){
        //创建者 数据校验
        checkName(createBy);
        //更新者 数据校验
        checkName(updateBy);
    }
    /**
     * 校验ScheduleEntity对象
     * **/
    public static void scheduleEntityCheck(Integer createByRole, Integer updateByRole){
        //创建者角色权限 数据校验
        enumerateCheck(createByRole,1);
        //更新者角色权限 数据校验
        enumerateCheck(updateByRole,1);
    }
    /**
     * 校验PlanSchedule对象
     * @param plan
     * @return
     * **/
    public static void planScheduleCheck(PlanSchedule plan){
        scheduleEntityCheck(plan.getCreateByRole(),plan.getUpdateByRole());
        baseEntityCheck(plan.getCreateBy(),plan.getUpdateBy());
        //审批模式 数据校验
        enumerateCheck(plan.getExaminePattern(),1);
        //计划状态 数据校验
        enumerateCheck(plan.getPlanState(),1);
        //审批状态 数据校验
        enumerateCheck(plan.getExamineState(),3);
        //生存周期 数据校验
        enumerateCheck(plan.getLifeCycle(),8);
        //检修对象 数据校验
        enumerateCheck(plan.getExamineChoice(),1);
        if (plan.getExamineChoice()==0){
            //零部件计划性质 数据校验
            enumerateCheck(plan.getPlanNature(),2);
        }else {
            //车辆对象计划性质 数据校验
            enumerateCheck(plan.getPlanNature(),3);
        }
        //检修条件 数据校验
        enumerateCheck(plan.getExamineCondition(),4);
        //检修对象名称 数据校验
        checkName(plan.getExamineObjName());
        //检修对象类型 数据校验
        checkConsequence(plan.getExamineObjType());
    }

    /**
     * 校验JobSchedule数据
     * @param job
     * @return
     * **/
    public static void jobScheduleCheck(JobSchedule job){
        scheduleEntityCheck(job.getCreateByRole(),job.getUpdateByRole());
        baseEntityCheck(job.getCreateBy(),job.getUpdateBy());
        //作业级别 数据校验
        enumerateCheck(job.getJobLevel(),1);
        //技术员工号 数据校验
        checkCardId(job.getStaffId());
        checkDataLength(job.getStaffId(),5,5);
        //技术员姓名 数据校验
        checkName(job.getStaffName());
        checkDataLength(job.getStaffName(),4,6);
//        //技术员职位 数据校验
//        if (!checkNumber(job.getStaffPosition())){
//            System.out.println("技术员职位 格式不规范!");
//            job.setStaffPosition(null);
//        }
        //作业反馈结果 数据校验
        enumerateCheck(job.getJobFeedBack(),5);
    }

}
